package com.xueyi.workflow.service.impl;

import com.xueyi.workflow.service.IWorkflowInstanceService;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.task.service.delegate.DelegateTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Set;

/**
 * 工作流实例服务实现类
 *
 * @author xueyi
 * @date 2024-07-03
 */
@Slf4j
@Service
public class WorkflowInstanceServiceImpl implements IWorkflowInstanceService {

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private HistoryService historyService;

    @Override
    public Long getStarterUserId(DelegateTask delegateTask) {
        try {
            // 首先尝试从流程变量获取发起人
            Object initiator = delegateTask.getVariable("initiator");
            if (initiator != null) {
                return Long.valueOf(initiator.toString());
            }

            // 从历史记录获取发起人
            String processInstanceId = delegateTask.getProcessInstanceId();
            Object startUserId = historyService.createHistoricProcessInstanceQuery()
                .processInstanceId(processInstanceId)
                .singleResult()
                .getStartUserId();
            
            if (startUserId != null) {
                return Long.valueOf(startUserId.toString());
            }

            log.warn("无法获取流程发起人，任务ID: {}", delegateTask.getId());
            return null;

        } catch (Exception e) {
            log.error("获取流程发起人失败", e);
            return null;
        }
    }

    @Override
    public Long getStarterDeptId(DelegateTask delegateTask) {
        try {
            Long starterId = getStarterUserId(delegateTask);
            if (starterId == null) {
                return null;
            }

            // TODO: 实际实现时应该调用系统服务
            // 根据用户ID查询其所属部门
            // 例如：userService.getUserDeptId(starterId)

            // 模拟数据：假设发起人属于部门1
            return 1L;

        } catch (Exception e) {
            log.error("获取发起人部门失败", e);
            return null;
        }
    }

    @Override
    public Long getStarterParentDeptId(DelegateTask delegateTask) {
        try {
            Long deptId = getStarterDeptId(delegateTask);
            if (deptId == null) {
                return null;
            }

            // TODO: 实际实现时应该调用系统服务
            // 根据部门ID查询其上级部门
            // 例如：deptService.getParentDeptId(deptId)

            // 模拟数据：假设部门1的上级部门是部门2
            if (deptId == 1L) {
                return 2L;
            }

            return null;

        } catch (Exception e) {
            log.error("获取发起人上级部门失败", e);
            return null;
        }
    }

    @Override
    public Set<Long> getDeptLeaderUserIds(Long deptId) {
        try {
            // TODO: 实际实现时应该调用系统服务
            // 根据部门ID查询部门负责人
            // 例如：organizeService.selectDeptLeaderByDeptId(deptId)

            // 模拟数据
            Set<Long> leaderIds = new java.util.HashSet<>();
            if (deptId == 1L) {
                leaderIds.add(2L); // 部门1的负责人是用户2
            } else if (deptId == 2L) {
                leaderIds.add(3L); // 部门2的负责人是用户3
            }

            log.info("部门{}的负责人: {}", deptId, leaderIds);
            return leaderIds;

        } catch (Exception e) {
            log.error("获取部门负责人失败", e);
            return new java.util.HashSet<>();
        }
    }

    @Override
    public Set<Long> getDeptUserIds(Long deptId) {
        try {
            // TODO: 实际实现时应该调用系统服务
            // 根据部门ID查询该部门的所有用户
            // 例如：organizeService.selectUserSetByDeptId(deptId)

            // 模拟数据
            Set<Long> userIds = new java.util.HashSet<>();
            if (deptId == 1L) {
                userIds.add(1L);
                userIds.add(2L);
                userIds.add(4L);
            } else if (deptId == 2L) {
                userIds.add(3L);
                userIds.add(5L);
            }

            log.info("部门{}的用户: {}", deptId, userIds);
            return userIds;

        } catch (Exception e) {
            log.error("获取部门用户失败", e);
            return new java.util.HashSet<>();
        }
    }
} 